www.gusucode.com > 基于马尔科夫随机场的图像分割matlab源码。包括ICM迭代条件模式求解最大后验概率算法 > code23/matlab MRF toy examples/oneIterBP.m

    % Sept. 2, 2003  billf.
% maxProductFlag = 1 means max product (MAP estimate), not sum product
% (MMSE estimate).

function nodes = oneIterBP(nodes, maxProductFlag);

% Go through every link, and transmit messages near to far
% ----------------------------------------------------------------
fprintf(1, '\nDoing belief propagation for %d nodes:\n', length(nodes)); tic;

% ----------------------------------------------------------------
for nearIdx = 1:length(nodes); 
    
    near = nodes{nearIdx};
    for linkIdx = 1:near.nLinks
        
        % - - - - - - - - - - - - - - - - - - - 
        message = near.localEvidence;
        
        link   = near.links{linkIdx};
        farIdx = link.farsIndex;
        far    = nodes{farIdx};
        for link2Idx = 1:near.nLinks if (link2Idx ~= linkIdx)
                link2 = near.links{link2Idx};        
                if ~isempty(link2.farsMessageToMe)
                    message = multMessages(message, link2.farsMessageToMe);
                end
            end; end;
        
        if (maxProductFlag) 
            message = max(nodes{nearIdx}.links{linkIdx}.propMat...
                .*repmat(message,size(nodes{nearIdx}.links{linkIdx}.propMat,1),1),[],2)';
        else message = (nodes{nearIdx}.links{linkIdx}.propMat * message')'; 
        end;
        
        nodes{ farIdx }.links{ link.farsLinkToMe }.fars_NEXT_MessageToMe = message;
        % - - - - - - - - - - - - - - - - - - - 
        
    end;
    
    fprintf(1, '.');
end;

fprintf(1,'\nDone propagating beliefs: %f secs\n',toc);

%------------------------------------------------------------------
% now *clock*, since we seem to do everything clocked these days
%------------------------------------------------------------------

fprintf(1, 'Clocking.... '); tic

for node = 1:length(nodes); 
    for link = 1:nodes{node}.nLinks
        nodes{node}.links{link}.farsMessageToMe = ...
            nodes{node}.links{link}.fars_NEXT_MessageToMe;
    end; % links to this node
end; % nodes

fprintf(1, ' ... Done %f secs\n',toc);